package io.xxx.xbutler.core.callback;

import com.alibaba.fastjson2.JSONObject;
import io.xxx.xbutler.domain.Callback;
import io.xxx.xbutler.domain.RobotRoomLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 自动退群回调
 * <p>
 * 机器人因风控原因自动退群，通过此接口回调
 * 每类型风控原因自动退群对应一种风控识别码，具体对应关系如下：
 * 200201：普通商家限制，群内存在第3个机器人（某个普通商家），第3个机器人自动退群。
 * 200203：单个群内存在踢机器人行为达到3次后，任何机器人入该群后自动退群。
 * 200204：一天被同一个用户踢出群的机器人（整个平台）达到5个，该用户进入黑名单，黑名单为管理员/群主所在的群，所有机器人自动退群。
 * 200205：单个机器人，被某个用户踢出群后，该机器人自动退出该用户为管理员/群主的所有群。
 * 200206：机器人群内检测到风险违规内容，自动退出该群。
 *
 * <pre>
 * {
 *     "nType": 4015,
 *     "vcMerchantNo": "",
 *     "vcRobotWxId": "",
 *     "vcRobotSerialNo": "",
 *     "vcSerialNo": "",
 *     "nResult": 1,
 *     "vcResult": "SUCCESS",
 *     "Data": {
 *         "vcChatRoomId": "",
 *         "vcChatRoomSerialNo": "",
 *         "vcChatRoomName": "",
 *         "vcChatRoomBase64Name": "",
 *         "nRiskTypeCode": "",
 *         "vcRiskTypeDesc": ""
 *     }
 * }
 * </pre>
 */
@Slf4j
@Component
public class _4015Handler extends RobotLeaveRoomHandler {

    @Override
    public String name() {
        return "自动退群回调";
    }

    @Override
    public boolean supports(int type) {
        return type == 4015;
    }

    @Override
    protected RobotRoomLog buildRobotRoomLog(Callback callback) {
        String robotId = callback.getRobotId();
        String robotSerialNo = callback.getRobotSerialNo();
        JSONObject data = (JSONObject) callback.getData();
        String roomId = data.getString("vcChatRoomId");
        return new RobotRoomLog()
                .setId(idGenerator.next())
                .setRobotId(robotId)
                .setRobotSerialNo(robotSerialNo)
                .setRoomId(roomId)
                .setRoomName(data.getString("vcChatRoomName"))
                .setBase64RoomName(data.getString("vcChatRoomBase64Name"))
                .setType(20)
                .setTime(callback.getTimestamp())
                .setRiskCode(data.getString("nRiskTypeCode"))
                .setRiskReason(data.getString("vcRiskTypeDesc"))
                .setCreatedTime(LocalDateTime.now());
    }
}
